Linux 文件系统
文件系统是一种用于存储和组织计算机数据的机制,它使用文件和树形目录的抽象逻辑概念来代替硬盘和光盘等物理设备使用数据块的概念。文件系统的设计使得对数据的访问和查找变得容易,用户不必关心数据实际保存在硬盘或光盘的哪个地址,只需要记住文件所属的目录和文件名。文件系统自动完成硬盘上的存储空间管理(分配和释放),用户只需要记住数据被写入到哪个文件中。
常见的文件系统列表如下:
- 文件配置表(File Allocation Table,FAT)系列:FAT12、FAT16、FAT32、exFAT
- 新技术文件系统(New Technology File System,NTFS)
- 分层文件系统(Hierarchical File System,HFS)和HFS Plus
- 延伸文件系统(Extended File System,ext)系列:ext1、ext2、ext3、ext4
- 旧式数据系统(Old Data System,ODS)
- Btrfs(B-tree文件系统)
- XFS(SGI的高性能日志文件系统)
- UFS(Unix文件系统)
- ZFS(Zettabyte文件系统)
在文件系统中,文件名是用于定位存储位置。大多数的文件系统对文件名的长度有限制。文件名可以是大小写不敏感的,也可以是大小写敏感的。现今的文件系统允许文件名包含非常多的 Unicode 字符集的字符,但某些特殊字符在文件名中受限。方便起见,一般不建议在文件名中包含特殊字符。
文件系统还维护元数据(Metadata),包括文件长度、最后修改时间、文件设备类型、文件所有者和访问权限等信息。有些文件系统还保存文件的创建时间、最后访问时间及属性修改时间。元数据还可以包括文件设备类型、字符集、套接口、子目录等信息。
文件系统可以通过访问控制列表或 capabilities 实现安全访问,但访问控制列表难以保证安全,因此研发中的文件系统倾向于使用 capabilities。然而目前多数商业性的文件系统仍然使用访问控制列表。
文件系统可以使用硬盘、光盘等物理设备存储数据,也可以通过网络协议提供数据,甚至可能根本没有对应的文件。严格来说,文件系统是一种实现数据的存储、分级组织、访问和获取等操作的抽象数据类型。
文件系统
在 Linux 系统中支持多种文件系统,如:Ext2、Ext3、Ext4、XFS、Btrfs、NTFS、FAT32、ISO 9660、NFS 等。
系统 | 全拼 | 功能 | 优点 | 用途 |
---|---|---|---|---|
Ext2 | Second Extended File System | 提供基本的文件存储功能 | 简单,速度较快,可靠性高 | 适用于小型存储设备,如闪存卡 |
Ext3 | Third Extended File System | 在Ext2基础上增加了日志功能 | 文件系统可靠性更高,具有较好的容错能力 | 适用于大多数Linux发行版,以及需要可靠数据存储的服务器环境 |
Ext4 | Fourth Extended File System | 在Ext3基础上增加了更多的特性,如更大的文件系统和更高的性能 | 支持大容量文件和高性能文件系统访问 | 适用于大型服务器和高性能计算机 |
XFS | XFS File System | 高性能文件系统,支持大容量文件和高吞吐量应用 | 速度快,可靠性高,适合高性能计算和大型存储设备 | 适用于需要大容量和高性能访问的服务器环境 |
Btrfs | B-tree File System | 先进的文件系统,支持快照、数据压缩和多个设备的联合文件系统等功能 | 可靠性高,能够在多个设备之间提供容错性 | 适用于需要高效数据管理和可靠存储的服务器和桌面环境 |
NTFS | New Technology File System | Windows操作系统上的文件系统,支持文件和目录的权限控制和加密等功能 | 可以处理很大的文件系统,能够在Windows和Linux之间进行数据传输 | 适用于需要与Windows系统交互的Linux系统 |
FAT32 | File Allocation Table 32-bit | 一种老旧的文件系统,支持大容量的存储设备 | 可以在不同的操作系统之间进行数据传输,通常用于移动设备和便携式存储介质上 | 适用于小型存储设备,如USB闪存盘和SD卡 |
ISO 9660 | International Standard Organization 9660 | 用于光盘文件系统 | 支持只读访问,可以在不同的操作系统之间进行数据传输 | 适用于在CD和DVD上发布数据的场景 |
NFS | Network File System | 一种网络文件系统,可以让不同的机器上的用户共享文件系统 | 能够在不同的计算机之间共享文件和目录,提供高度的数据访问性能 | 适用于需要在多个计算机之间共享文件的网络环 |
层次结构
在 Linux 系统中,文件系统采用了一种层次结构来组织文件和目录,这种层次结构称为文件系统层次结构(Filesystem Hierarchy Standard,FHS)。FHS 是一种标准化的文件系统层次结构,规定了在不同的 Linux 系统中应该如何组织文件和目录,以保证文件系统的一致性和兼容性。
目录名 | 全拼 | 功能 | 用途 |
---|---|---|---|
/ | Root | 根目录 | 包含所有其他目录和文件的根目录 |
/bin | Binary | 存放系统二进制可执行文件 | 包含最基本的系统命令 |
/boot | Boot | 存放启动加载程序和内核 | 包含启动Linux系统所必需的文件 |
/dev | Device | 存放设备文件 | 包含Linux系统中所有的设备文件,如硬盘、键盘、鼠标等 |
/etc | Etcetera | 存放系统配置文件 | 包含Linux系统中所有的系统配置文件,如网络配置文件、用户账号配置文件等 |
/home | Home | 存放用户家目录 | 包含所有用户的家目录 |
/lib | Library | 存放系统共享库文件 | 包含系统运行时所需要的一些库函数 |
/media | Media | 存放可移动介质挂载点 | 包含可移动介质的挂载点,如U盘、光盘等 |
/mnt | Mount | 存放挂载点 | 包含文件系统挂载点,用于临时挂载其他文件系统 |
/opt | Optional | 存放第三方应用程序 | 包含安装在系统中的第三方应用程序 |
/proc | Process | 存放进程相关信息 | 包含Linux系统中所有进程的相关信息 |
/root | Root | root用户家目录 | 仅限root用户访问的家目录 |
/run | Run | 存放运行时信息 | 包含运行时所需要的各种信息,如进程号等 |
/sbin | System Binary | 存放系统管理二进制可执行文件 | 包含系统管理员使用的基本命令和系统管理工具 |
/srv | Service | 存放服务相关数据 | 包含服务相关的数据,如Web服务的网站文件 |
/sys | System | 存放系统设备文件 | 包含系统中所有设备的相关信息 |
/tmp | Temporary | 存放临时文件 | 包含系统中各种临时文件 |
/usr | Unix Shared Resources | 存放Unix共享资源 | 包含系统中大多数应用程序、库文件和文档等 |
/var | Variable | 存放经常变化的文件 | 包含系统中经常变化的文件,如日志文件、数据库文件等 |
文件元数据
在 Linux 系统中,每个文件都有其对应的元信息,也称为元数据(metadata)。元数据包含了文件的基本属性,如文件的创建时间、访问时间、修改时间,文件大小,文件所有者和所属组,文件的权限等等。
以下是一些常见的文件元数据:
- 文件名:文件的名字,用于标识文件。
- 文件类型:表示文件的类型,如普通文件、目录、链接文件、字符设备、块设备等等。
- 文件大小:表示文件的大小,以字节为单位。
- 时间戳:记录了文件的创建时间、访问时间、修改时间等信息。
- 文件权限:文件所有者、所属组、其他用户对文件的读、写、执行权限。
- 文件所有者和所属组:表示文件的所有者和所属组。
- 文件状态:如 inode 号码、硬链接数等。
在 Unix 和类 Unix 操作系统中 文件系统中,每个文件或目录都有一个inode号码,它是唯一的,由文件系统分配,文件名只是 inode 的别名而已。当我们打开一个文件时,实际上是根据该文件名找到对应的 inode,然后通过 inode 读取文件的数据。
index node (inode) 是 Unix 和类 Unix 操作系统中的一个重要概念,它是文件系统中用来存储文件或目录的元数据信息的一种数据结构,每个文件或目录都对应一个唯一的 inode。下面是一个示例 inode 表格:
文件类型 | inode号 | 大小 | 拥有者 | 权限 | 访问时间 | 修改时间 | 创建时间 |
---|---|---|---|---|---|---|---|
普通文件 | 12345 | 1KB | root | 644 | 2022/3/1 | 2022/3/2 | 2022/3/1 |
物理设备文件
在 Linux 系统中,一切都是文件,包括硬件设备也不例外。这是因为在 Linux 中,硬件设备被抽象成了一种特殊的文件类型,称为设备文件(Device file)。设备文件用于对硬件设备进行读写操作,类似于普通文件的读写操作。设备文件分为两种类型:
- 块设备文件:对应的硬件设备是以块为单位进行读写的设备,例如硬盘、U盘等;
- 字符设备文件:对应的硬件设备是以字符为单位进行读写的设备,例如键盘、鼠标、打印机等。
在 Linux 系统中,每个设备文件都有一个对应的设备文件名,该文件名通常位于 /dev 目录下,不同的硬件设备会有不同的设备文件名。通过访问设备文件,用户可以对硬件设备进行操作。例如,如果想要读取硬盘的数据,用户可以通过访问对应的设备文件(如 /dev/sda)来读取数据,而不需要关心具体的物理硬盘是什么型号、连接方式等等。这种抽象的方式让用户更方便地使用硬件设备,并且使得操作系统能够更好地管理硬件设备。
硬件设备 | 命名规则 |
---|---|
IDE 接口硬盘 | /dev/hd[a-d] |
SCSI、SATA、U盘 | /dev/sd[a-z] |
KVM/QEMU 虚拟设备 | /dev/vd[a-z] |
软盘 | /dev/fd[0-1] |
打印机 | /dev/lp[0-15] |
CD/DVD 光盘驱动器 | /dev/cdrom |
鼠标设备 | /dev/mouse |
SCSI 接口磁带机或 IDE 接口 | /dev/st0 或 /dev/ht0 |
管理和维护
目录操作
操作 | 命令 | 描述 | 示例 |
---|---|---|---|
查看 | ls | 列出目录内容 | ls -l /home |
pwd | 显示当前工作目录 | pwd | |
tree | 以树形结构显示目录和文件 | tree /home/user | |
创建 | mkdir | 创建新目录 | mkdir /home/new_directory |
复制 | cp | 复制目录或文件 | cp -R /source /destination |
移动 | cd | 更改当前工作目录 | cd /home/user |
pushd | 将当前目录压入栈,并切换到新目录 | pushd /home/new_directory | |
popd | 从栈中弹出目录并切换回去 | popd | |
删除 | rmdir | 删除空目录 | rmdir /home/empty_directory |
文件操作
操作 | 命令 | 描述 | 示例 |
---|---|---|---|
查看 | file | 确定文件类型 | file file.txt |
cat | 显示文件内容 | cat file.txt | |
more | 分页显示文件内容 | more file.txt | |
less | 可以向前和向后翻页显示文件内容 | less file.txt | |
head | 显示文件的开头部分 | head -n 5 file.txt | |
tail | 显示文件的末尾部分 | tail -n 5 file.txt | |
查找 | whereis | 查找可执行文件、源码和手册页 | whereis python3 |
which | 显示可执行文件的位置 | which python3 | |
find | 搜索文件和目录 | find /home -name "file.txt" | |
创建 | touch | 创建空文件或更新文件时间戳 | touch new_file.txt |
ln | 创建硬链接和符号链接 | ln -s source_file.txt link.txt | |
复制 | cp | 复制文件 | cp source_file.txt destination.txt |
移动 | mv | 移动文件或目录 | mv source_file.txt destination.txt |
删除 | rm | 删除文件或目录 | rm file.txt |
文件处理
基础
命令 | 描述 | 示例 |
---|---|---|
grep | 在文件中搜索字符串或正则表达式 | grep "pattern" file.txt |
sed | 流编辑器,用于对文本文件进行基于行的编辑 | sed 's/foo/bar/g' input.txt > output.txt |
diff | 比较文件差异 | diff file1.txt file2.txt |
diff3 | 比较三个文件差异 | diff3 file1.txt file2.txt file3.txt |
md5sum | 计算文件的 MD5 校验和 | md5sum file.txt |
awk | 文本处理工具,用于对文本进行模式扫描和处理 | awk '{ print $1 }' file.txt |
sort | 对文件中的行进行排序 | sort file.txt |
uniq | 去除文件中的重复行 | uniq file.txt |
tr | 翻译或删除字符 | tr 'a-z' 'A-Z' < input.txt > output.txt |
wc | 计算字节数、字符数、行数 | wc file.txt |
cut | 从文件中移除一部分 | cut -f 1,3 -d ',' file.txt |
paste | 横向连接文件 | paste file1.txt file2.txt |
Nano
Nano 是一款基于命令行的文本编辑器,它是 Linux 中最常用的编辑器之一。以下是 Nano 的常用命令:
命令 | 功能 |
---|---|
Ctrl + G | 显示帮助文档 |
Ctrl + O | 保存文件 |
Ctrl + X | 退出Nano |
Ctrl + K | 剪切当前行 |
Ctrl + U | 粘贴剪切的行 |
Ctrl + W | 查找文本 |
Ctrl + \ | 替换文本 |
Ctrl + ↑ | 移动到文本的上一屏 |
Ctrl + ↓ | 移动到文本的下一屏 |
Ctrl + → | 移动到文本的下一单词 |
Ctrl + ← | 移动到文本的上一单词 |
下面是一些 Nano 编辑器的使用示例:
打开文件:
Copy code
nano filename.txt这将打开一个名为 “filename.txt” 的文件,并将其用 Nano 编辑器打开。
查找文本:
您可以使用
Ctrl + W
来查找文本。输入您想要查找的文本,然后按Enter
键。Nano 将跳转到文本中找到的第一个匹配项。替换文本:
您可以使用
Ctrl + \
来替换文本。输入您想要替换的文本和替换文本,然后按Enter
键。Nano 将替换文本中找到的第一个匹配项。剪切和粘贴行:
使用
Ctrl + K
剪切当前行,使用Ctrl + U
粘贴剪切的行。移动光标:
使用
Ctrl + ↑
和Ctrl + ↓
移动到文本的上一屏或下一屏;使用Ctrl + →
和Ctrl + ←
移动到文本的下一单词或上一单词。保存和退出:
使用
Ctrl + O
保存文件,使用Ctrl + X
退出Nano编辑器。
Vim
Vim 是一款文本编辑器,也是Linux中最常用的编辑器之一。Vim 支持多种编辑模式,包括命令模式、插入模式和可视模式。以下是 Vim 的常用命令:
命令 | 功能 |
---|---|
:w | 保存文件 |
:q | 退出Vim |
:wq | 保存文件并退出Vim |
i | 进入插入模式 |
Esc | 退出插入模式并返回命令模式 |
v | 进入可视模式 |
V | 进入行选择模式 |
y | 复制选中文本 |
p | 粘贴文本 |
/ | 查找文本 |
: | 进入命令模式 |
下面是一些 Vim 编辑器的使用示例:
打开文件:
Copy code
vim filename.txt这将打开一个名为 “filename.txt” 的文件,并将其用 Vim 编辑器打开。
保存文件:
在命令模式下输入
:w
,然后按Enter
键即可保存文件。退出 Vim:
在命令模式下输入
:q
,然后按Enter
键即可退出 Vim。保存文件并退出 Vim:
在命令模式下输入
:wq
,然后按Enter
键即可保存文件并退出 Vim。插入文本:
在命令模式下按下
i
进入插入模式,然后开始编辑文本。复制和粘贴文本:
进入可视模式(按下
v
),选择要复制的文本,然后按下y
复制选中文本。返回命令模式后,将光标移动到要粘贴文本的位置,按下p
粘贴文本。查找文本:
在命令模式下输入
/
,然后输入要查找的文本并按下Enter
键。Vim 将跳转到文本中找到的第一个匹配项。
文件解压缩
Tar
Tar(磁带归档器,Tape Archive)是一种用于文件打包(归档)的 UNIX 和 Linux 系统上的实用程序。它能将多个文件和目录合并成一个单独的归档文件,便于文件的传输、备份和存储。需要注意的是,Tar 本身并不具备压缩功能,但它可以与其他压缩工具(如Gzip、Bzip2等)结合使用,以实现文件归档与压缩的需求。
优点
- 跨平台兼容性:Tar 是 UNIX 和 Linux 系统的标准工具,但在其他操作系统(如 Windows、macOS 等)上也有实现,因此具有较强的跨平台兼容性。
- 保留文件属性:Tar 可以在归档过程中保留文件和目录的原始属性(如权限、时间戳等),便于在解包时恢复文件的状态。
- 可与压缩工具结合:尽管 Tar 本身不具备压缩功能,但可以与 Gzip、Bzip2 等压缩工具结合使用,提供压缩功能。
- 适用于大型文件集合:Tar 能有效地处理大量文件和目录,将它们打包成一个单独的归档文件,便于管理和传输。
缺点
- 不具备原生压缩功能:Tar 本身不具有压缩功能,需要与其他压缩工具结合使用。
- 压缩效率较低:与一体化的压缩工具相比,使用 Tar 结合其他压缩工具的方式在压缩效率上可能略有不足。
适用场景
- 文件备份:Tar 可以将多个文件和目录打包成一个归档文件,便于进行文件备份和存储。
- 文件传输:将多个文件和目录打包成一个归档文件,可以方便地进行文件传输,尤其是在网络传输中,减少传输次数和网络开销。
- 软件发布:开发者经常使用 Tar 打包源代码或二进制文件,方便用户下载和安装。
- 数据压缩:与压缩工具(如 Gzip、Bzip2 等)结合使用,可以实现文件的归档与压缩。
总的来说,Tar 是一种非常灵活的文件打包和压缩工具,具有多种压缩格式支持、易于传输和备份、支持文件和目录和支持存档格式等优点。但是,它的压缩比较低,不支持加密,因此在选择使用 Tar 时,需要根据具体的场景和需求来综合考虑其优缺点。
常见命令
命令 | 描述 |
---|---|
tar -cvf archive.tar file1 file2 directory1 | 创建归档文件 |
tar -xvf archive.tar | 解压缩归档文件 |
tar -tvf archive.tar | 查看归档文件的内容 |
tar -zcvf archive.tar.gz file1 file2 directory1 | 压缩归档文件为.gz格式 |
tar -zxvf archive.tar.gz | 解压缩.gz格式的归档文件 |
tar -jcvf archive.tar.bz2 file1 file2 directory1 | 压缩归档文件为.bz2格式 |
tar -jxvf archive.tar.bz2 | 解压缩.bz2格式的归档文件 |
tar -P | 保留绝对路径 |
tar --exclude='*.log' directory1 | 排除指定文件或目录 |
常见选项
选项 | 全拼 | 功能 |
---|---|---|
-c | --create | 创建归档文件 |
-x | --extract | 解压归档文件 |
-t | --list | 查看归档文件中的文件列表 |
-f | --file | 指定归档文件的名称 |
-z | --gzip | 使用gzip压缩算法压缩归档文件 |
-j | --bzip2 | 使用bzip2压缩算法压缩归档文件 |
-v | --verbose | 在执行操作时显示详细信息 |
-P | --absolute-names | 保留文件和目录的绝对路径 |
--exclude | --exclude=PATTERN | 排除匹配指定模式的文件或目录 |
Zip
ZIP(Zone Information Protocol)是一种广泛使用的文件压缩和归档格式工具,它可以将多个文件或目录打包成一个单独的文件,以便于传输、备份和存档。这种格式最初是由Phil Katz在1989年开发的,现在已成为一种通用的归档和压缩标准。
优点
- 跨平台兼容性:Zip 是一种通用的文件压缩和归档格式,几乎所有的操作系统(如Windows、macOS、Linux等)都支持Zip格式,具有很强的跨平台兼容性。
- 集成压缩和归档功能:Zip 同时具备文件压缩和归档功能,可以将多个文件和目录压缩成一个文件,便于传输和存储。
- 压缩率适中:Zip 格式的压缩率适中,能有效减少文件大小,从而节省存储空间和加快文件传输速度。
- 随机访问:Zip 支持随机访问,可以在不解压整个压缩包的情况下提取单个文件。
- 密码保护:Zip 格式支持为压缩文件设置密码,以提高文件的安全性。
缺点
- 压缩效率:与一些专门的压缩算法(如7z、Bzip2等)相比,Zip 的压缩效率较低,可能无法获得最佳的压缩效果。
- 加密安全性:Zip 的标准加密算法较弱,容易受到密码破解工具的攻击。虽然现代的 Zip 实现支持更强大的加密算法,但并非所有的压缩工具都支持这些算法。
适用场景
- 文件传输:Zip 可以将多个文件和目录压缩成一个文件,减小文件大小,方便在不同设备和平台之间进行传输。
- 文件存储:将文件和目录压缩成 Zip 格式,可以节省存储空间,便于备份和管理。
- 软件分发:开发者经常使用 Zip 格式打包软件和资源,便于用户下载和安装。
- 文档压缩:将文档、图片等资料压缩成 Zip 格式,方便存储和分享。
总的来说,Zip 是一种广泛使用的文件压缩和归档格式,具有很强的跨平台兼容性。它可以将多个文件和目录压缩成一个文件,便于传输和存储。Zip 的压缩率适中,支持随机访问和密码保护。然而,与一些专门的压缩算法(如7z、Bzip2等)相比,Zip 的压缩效率较低,可能无法获得最佳的压缩效果。
此外,虽然 Zip64 扩展已经解决了传统 Zip 格式中的 4GB 文件大小限制,但并非所有的压缩解压缩工具都支持 Zip64,因此在处理大文件时需要注意选择合适的工具。
常见命令
命令 | 描述 |
---|---|
zip archive.zip file1 file2 directory1 | 创建Zip归档文件 |
unzip archive.zip | 解压缩Zip归档文件 |
zip -r archive.zip directory1 | 压缩目录为Zip归档文件 |
unzip -l archive.zip | 列出Zip归档文件中的文件列表 |
zip -e archive.zip file1 file2 | 使用加密算法压缩文件为Zip归档文件 |
常见选项
选项 | 全拼 | 功能 |
---|---|---|
-r | --recurse-paths | 递归压缩目录及其所有子目录 |
-e | --encrypt | 使用加密算法压缩文件 |
-d | --delete | 从Zip归档文件中删除文件 |
-u | --update | 更新Zip归档文件中的文件 |
-l | --list | 列出Zip归档文件中的文件列表 |
-v | --verbose | 在执行操作时显示详细信息 |
-q | --quiet | 在执行操作时禁止输出 |
-f | --file | 指定归档文件的名称 |
-z | --gzip | 使用gzip压缩算法压缩归档文件 |
-j | --bzip2 | 使用bzip2压缩算法压缩归档文件 |
Gzip
Gzip(GNU zip)是一种广泛使用的文件压缩和解压缩工具。它基于DEFLATE算法,该算法结合了LZ77(Lempel-Ziv 77)和Huffman编码技术,能够有效地压缩文件。Gzip 主要用于压缩单个文件,而不是整个目录结构。在Linux和Unix系统中,Gzip 常与 Tar(磁带归档器)结合使用,以实现文件归档和压缩的双重功能。
优点
- 高压缩率:Gzip 通常能提供较高的压缩率,从而降低文件大小,节省存储空间和带宽。
- 快速压缩和解压缩速度:Gzip 在保证较高压缩率的同时,压缩和解压缩速度相对较快。
- 跨平台兼容性:Gzip 在Linux、Unix、macOS 和 Windows 等操作系统上都有实现,具有良好的跨平台兼容性。
- 开源和免费:Gzip 是 GNU 项目的一部分,遵循开源协议,免费提供给用户使用。
缺点
- 仅支持单文件压缩:Gzip 本身只能压缩单个文件,无法直接压缩目录。通常需要与 Tar 等归档工具结合使用。
- 压缩效率高:虽然 Gzip 的压缩效率较高,但与一些专门的压缩算法(如7z、Bzip2等)相比,可能无法获得最佳的压缩效果。
适用场景
- 文件传输:Gzip 可以将文件压缩成更小的体积,有助于减少传输时间和网络开销。
- 网页优化:服务器可以使用 Gzip 压缩网页内容,提高传输速度,降低带宽消耗,提高用户体验。
- 数据存储:Gzip 可以用于压缩文档、日志文件等,节省存储空间。
- 软件分发:开发者可以将源代码或二进制文件压缩为 Gzip 格式,便于用户下载和安装。
总之,Gzip 是一种广泛使用的文件压缩工具,基于 DEFLATE 算法,提供较高的压缩率和较快的压缩速度。尽管 Gzip 仅支持单文件压缩,但可以与 Tar 等归档工具结合使用,实现目录的压缩。具有良好的跨平台兼容性和开源性质,适用于文件传输、网页优化、数据存储和软件分发等场景。在压缩效率方面,虽然 Gzip 表现出色,但可能无法与一些专门的压缩算法(如7z、Bzip2等)相媲美。
常见命令
命令 | 描述 |
---|---|
gzip file.txt | 压缩文件“file.txt” |
gzip -r directory1 | 递归压缩目录“directory1”及其所有子目录和文件 |
gzip -d file.txt.gz | 解压缩Gzip压缩的文件“file.txt.gz” |
gzip -l file.txt.gz | 查看Gzip压缩文件“file.txt.gz”的详细信息 |
gzip -v file.txt | 压缩文件“file.txt”并显示压缩进度 |
常见选项
选项 | 选项全称 | 功能 |
---|---|---|
-d | --decompress | 解压缩文件 |
-r | --recursive | 递归压缩目录及其所有子目录 |
-l | --list | 列出Gzip压缩文件的详细信息 |
-v | --verbose | 显示操作的详细信息 |
-q | --quiet | 禁止输出操作信息 |
-f | --force | 强制执行操作,即使会覆盖文件 |
-t | --test | 测试Gzip压缩文件的完整性 |
-k | --keep | 保留原始文件,不删除压缩文件 |
Bzip2
Bzip2 是一款开源的文件压缩工具,使用 Burrows-Wheeler 算法(BWT)以及哈夫曼编码进行文件压缩。Bzip2 专注于提供高压缩率,通常能够比 Gzip 提供更高的压缩效果,但相应的压缩和解压缩速度较慢。与 Gzip 类似,Bzip2 主要用于压缩单个文件,而不是整个目录结构。在 Linux 和 Unix 系统中,Bzip2 也常与 Tar 归档工具结合使用。
优点
- 高压缩率:Bzip2 通常能提供比 Gzip 更高的压缩率,从而进一步减小文件大小,节省存储空间和带宽。
- 开源和免费:Bzip2 是一个开源项目,可以免费使用。
- 跨平台兼容性:Bzip2 在 Linux、Unix、macOS 和 Windows 等操作系统上都有实现,具有良好的跨平台兼容性。
缺点
- 速度较慢:由于 Bzip2 的高压缩率,压缩和解压缩速度相对较慢,特别是与 Gzip 相比。
- 仅支持单文件压缩:Bzip2 本身只能压缩单个文件,无法直接压缩目录。通常需要与 Tar 等归档工具结合使用。
适用场景
- 文件存储:当存储空间有限且需要高压缩率时,Bzip2 可用于压缩文档、日志文件等。
- 文件传输:Bzip2 可以将文件压缩成更小的体积,有助于减少传输时间和网络开销,尤其在对压缩率要求较高的场景中。
- 软件分发:开发者可以将源代码或二进制文件压缩为 Bzip2 格式,以获得更小的文件体积,便于用户下载和安装。
简单总结:Bzip2 是一款开源的文件压缩工具,使用 Burrows-Wheeler 算法和哈夫曼编码,提供较高的压缩率,但压缩和解压缩速度较慢。Bzip2 主要用于压缩单个文件,可以与 Tar 等归档工具结合使用,具有良好的跨平台兼容性。适用于文件存储、传输和软件分发等场景,特别是在对压缩率要求较高的情况下。
常见命令
命令 | 描述 |
---|---|
bzip2 file.txt | 压缩文件“file.txt” |
bzip2 -k file.txt | 压缩文件“file.txt”并保留原始文件 |
bzip2 -d file.txt.bz2 | 解压缩Bzip2压缩的文件“file.txt.bz2” |
bzip2 -l file.txt.bz2 | 查看Bzip2压缩文件“file.txt.bz2”的详细信息 |
bzip2 -v file.txt | 压缩文件“file.txt”并显示压缩进度 |
常见选项
选项 | 选项全称 | 功能 |
---|---|---|
-c | --stdout | 将输出写入标准输出,而不是写入压缩文件。 |
-d | --decompress | 解压缩Bzip2压缩文件,生成原始文件。 |
-f | --force | 强制覆盖现有的压缩文件,而不提示。 |
-k | --keep | 保留原始文件,不删除生成的压缩文件。 |
-q | --quiet | 不显示任何压缩和解压缩过程的信息。 |
-t | --test | 测试Bzip2压缩文件的完整性。 |
-v | --verbose | 显示详细的压缩和解压缩过程的信息。 |
-z | --compress | 使用Bzip2进行压缩,生成Bzip2压缩文件(默认选项)。 |
-1 | --fast | 使用1级别的压缩,生成速度快,压缩比低的压缩文件。 |
-2 | --best | 使用2级别的压缩,生成速度慢,压缩比高的压缩文件(默认级别)。 |
-3 | --small | 使用3级别的压缩,生成速度较慢,压缩比更高的压缩文件。 |
-4 | 使用4级别的压缩,生成速度更慢,压缩比更高的压缩文件。 | |
-5 | 使用5级别的压缩,生成速度更慢,压缩比更高的压缩文件。 | |
-6 | 使用6级别的压缩,生成速度更慢,压缩比更高的压缩文件。 | |
-7 | 使用7级别的压缩,生成速度更慢,压缩比更高的压缩文件。 | |
-8 | 使用8级别的压缩,生成速度更慢,压缩比更高的压缩文件。 | |
-9 | --best-quality | 使用9级别的压缩,生成速度最慢,压缩比最高的压缩文件。 |
7z
7z(7-Zip)是一款开源的文件压缩和解压缩工具,主要使用 LZMA(Lempel-Ziv-Markov链算法)和 LZMA2 算法进行压缩。7z 格式以高压缩率和高压缩速度而著称,通常能够提供比 Gzip 和 Bzip2 更高的压缩效果。除了 7z 格式,7-Zip 还支持其他压缩格式,如 ZIP、Gzip、Bzip2、Tar 等。
优点
- 高压缩率:7z 格式通常能提供非常高的压缩率,从而进一步减小文件大小,节省存储空间和带宽。
- 压缩速度:7z 在保证高压缩率的同时,压缩速度相对较快。
- 多文件支持:7z 支持压缩多个文件和目录结构,无需额外的归档工具。
- 密码保护:7z 支持使用 AES-256 加密算法对压缩文件进行密码保护。
- 开源和免费:7-Zip 是一个开源项目,可以免费使用。
- 跨平台兼容性:7-Zip 在 Windows、Linux 和 macOS 等操作系统上都有实现,具有良好的跨平台兼容性。
缺点
- 广泛支持度:尽管 7z 格式具有许多优点,但与 ZIP 和 Gzip 相比,它的支持和普及程度相对较低。
- 可能需要额外软件:在某些操作系统(如 macOS 和 Linux)上,可能需要额外安装 7-Zip 或类似工具,以支持 7z 格式。
适用场景
- 文件存储:当存储空间有限或需要高压缩率时,7z 可用于压缩文档、日志文件等。
- 文件传输:7z 可以将文件压缩成更小的体积,有助于减少传输时间和网络开销。
- 软件分发:开发者可以将源代码或二进制文件压缩为 7z 格式,以获得更小的文件体积,便于用户下载和安装。
- 数据备份:7z 支持压缩大量文件和目录结构,适用于对数据进行备份和归档。
简单总结:7z 是一款开源的文件压缩工具,使用 LZMA 和 LZMA2 算法,提供高压缩率和较快的压缩速度。7z 支持压缩多个文件和目录结构,支持密码保护,具有良好的跨平台
常见命令
命令 | 描述 |
---|---|
7z a archive.7z file1 file2 | 将 file1 和 file2 添加到名为 archive.7z 的压缩文件中 |
7z a -r archive.7z folder | 将 folder 目录及其子目录递归添加到名为 archive.7z 的压缩文件中 |
7z e archive.7z | 从 archive.7z 提取文件,不保留目录结构 |
7z x archive.7z | 从 archive.7z 提取文件,保留目录结构 |
7z l archive.7z | 显示名为 archive.7z 的压缩文件中的文件列表 |
7z t archive.7z | 测试名为 archive.7z 的压缩文件的完整性 |
7z a -pPASSWORD archive.7z file | 将 file 添加到名为 archive.7z 的压缩文件中,并使用密码 PASSWORD 保护 |
7z a -sfx archive.exe file | 创建名为 archive.exe 的自解压缩可执行文件,其中包含 file |
7z a -tzip archive.zip file | 将 file 添加到名为 archive.zip 的 ZIP 格式压缩文件中 |
7z a archive.7z -v100m file | 将 file 添加到名为 archive.7z 的压缩文件中,并创建 100MB 的分卷文件 |
常见选项
选项 | 全拼 | 功能 |
---|---|---|
a | Add | 添加文件到压缩文件 |
e | Extract | 提取压缩文件,不保留目录结构 |
l | List | 显示压缩文件中的文件列表 |
t | Test | 测试压缩文件的完整性 |
x | eXtract with full paths | 提取压缩文件,保留目录结构 |
-p | Password | 设置压缩文件的密码 |
-r | Recurse | 递归处理子文件夹 |
-sfx | Create SFX archive | 创建自解压缩可执行文件 |
-t | Type | 指定压缩文件的类型(如 7z、zip、gzip 等) |
-v | Create volumes | 创建多卷压缩文件 |
权限和安全
Linux 文件系统的权限和安全主要可以分为四个部分:常用权限控制、特殊权限控制、隐藏权限控制和 SELinux 权限控制。
常用权限
Linux 系统中有三种基本的权限:读(r,read)、写(w,write)和执行(x,execute)。也可以使用数字来表示文件或目录的权限。每个权限用一个数字表示,分别为 4、2 和 1,分别代表读、写和执行权限。通过将这些数字相加,可以得到一个三位数的数字,用于表示用户、组和其他用户的权限。这些权限分别适用于文件和目录。权限可以分为三组,分别为:用户(u,user),组(g,group)和其他(o,others)。
- 文件权限设置为 -rw-r--r--:
chmod 644 file.txt
、chmod u=rw,g=r,o=r file.txt
- 文件所有者设置执行权限:
chmod u+x file.txt
- 文件所有组去除写入和执行权限:
chmod g-wx file.txt
- 文件其他用户设置只读权限:
chmod o=r file.txt
注意:chmod +
表示添加权限,-
表示删除权限,=
表示设置权限。
drwxr-xr-x 1 root root 4096 Dec 10 03:15 boot
这是一个目录(d开头),权限为rwxr-xr-x,所有者为root,所属组也为root,大小为4096字节,创建时间为12月10日 03:15。
所有者(root)具有读、写和执行权限(rwx)
所属组(root)和其他用户具有读和执行权限(r-x)
总的来说,这个目录的权限是755(rwxr-xr-x),所有者有最高的权限,可以对目录进行任何操作,而组和其他用户只有读和执行权限。
权限 | 数字 | 文件权限 | 目录权限 |
---|---|---|---|
读(r) | 4 | 允许用户读取文件内容 | 允许用户查看目录内容 |
写(w) | 2 | 允许用户修改文件内容 | 允许用户在目录中创建、删除和重命名文件 |
执行 (x) | 1 | 允许用户执行文件(如程序或脚本) | 允许用户进入目录 |
特殊权限
Linux 系统中,特殊权限是指那些不同于常规文件和目录权限(读、写、执行)的权限。这些特殊权限有助于控制用户或进程在访问或操作文件时所拥有的权限。
- 文件设置粘滞位:
chmod o+t
- 文件取消粘滞位:
chmod o-t
特殊权限 | 示例 | 描述 |
---|---|---|
Setuid (suid) | chmod u+s | 当文件具有 setuid 权限时,任何用户在执行该文件时都将获得文件所有者的权限。 |
Setgid (sgid) | chmod g+s | 当文件具有 setgid 权限时,用户可以以文件所属组的权限执行文件。对于目录,具有 setgid 权限的目录下创建的文件和子目录自动继承该目录的组。 |
粘滞位 (Sticky Bit) | chmod o+t | 当为目录设置粘滞位时,只有文件所有者和 root 用户可以删除或重命名该目录中的文件。 |
隐藏权限
Linux 系统中,隐藏权限通常指那些不容易被用户发现的权限。这些权限可以通过 chattr
命令设置,并使用 lsattr
命令查看。隐藏权限有助于保护文件免受意外删除或修改,从而增强 Linux 系统的安全性。
- 文件设置不可修改(i)权限:
chattr +i example.txt
- 文件取消不可修改(i)权限:
chattr -i example.txt
- 查看文件的隐藏权限:
lsattr example.txt
隐藏权限 | chattr 参数 | 作用 |
---|---|---|
Immutable | i | 无法修改文件,目录中子文件内容可修改,不能新建或删除文件 |
Append only | a | 仅允许追加内容,无法覆盖/删除内容 |
Sync | S | 文件内容变更后立即同步到硬盘 |
Secure deletion | s | 彻底删除,不可恢复(用 0 填充原文件所在硬盘区域) |
No update of atime | A | 不再修改文件或目录的最后访问时间 |
No update of btime | b | 不再修改文件或目录的存取时间 |
Error checking | D | 检查压缩文件中的错误 |
No dump | d | 使用 dump 命令备份时忽略本文件/目录 |
Compression | c | 默认将文件或目录进行压缩 |
Undeletion | u | 删除后保留在硬盘中的数据,方便恢复 |
Tail-merging | t | 让文件系统支持尾部合并 |
Direct access | x | 可以直接访问压缩文件中的内容 |
SELinux
SELinux(Security-Enhanced Linux)是一个强大的 Linux 内核安全模块,用于实现访问控制安全策略。它通过强制访问控制(MAC)限制用户和进程对系统资源的访问,从而提高系统安全性。
SELinux 的起源可以追溯到 1998 年,当时美国国家安全局(NSA)与安全系统研究小组(SFR)共同开发了一个名为 Flask 的安全架构。该架构的目标是为操作系统提供一种强大且灵活的访问控制机制。在 2000 年,NSA 将 Flask 架构集成到 Linux 内核中,从而诞生了 SELinux。
SELinux 的开发过程受到了开源社区的广泛支持。Red Hat 在 2003 年发布的 Red Hat Enterprise Linux 4(RHEL 4)中首次将 SELinux 作为默认安全模块。此后,许多其他 Linux 发行版,如 CentOS、Fedora 和 Gentoo,也开始支持 SELinux。
SELinux 的发展方向主要集中在以下几个方面:
- 提高安全性:SELinux 将继续优化安全策略,提高系统安全性。例如,通过引入更多安全策略类型,如基于属性的访问控制(ABAC),以满足不断变化的安全需求。
- 简化配置和管理:尽管 SELinux 的学习曲线较陡,但它将继续努力简化安全策略的配置和管理,以便降低使用门槛。
- 性能优化:SELinux 将持续改进性能,以减轻其对系统性能的影响,同时确保高度安全性。
- 社区合作与支持:SELinux 将继续与开源社区合作,共同推动 Linux 安全模块的发展和完善。此外,它将继续提供支持和培训,帮助用户更好地理解和应用 SELinux。
优点
- 提供详细的安全策略和访问控制,支持多种安全策略,如基于角色的访问控制(RBAC)和类型强制访问控制(TE)等。
- 通过强制访问控制(MAC)限制用户和进程对系统资源的访问,从而提高系统安全性。
- 被广泛应用于许多 Linux 发行版,如 Red Hat Enterprise Linux (RHEL)、CentOS 和 Fedora 等。
- 完全集成在内核中,提供强大的安全保护。
缺点
SELinux 的缺点包括配置和学习复杂,性能开销较大。因此,它更适用于高度安全要求的环境,如政府、金融和敏感数据处理等场景。在这些场合,SELinux 能够提供强大且灵活的安全策略,以满足不同的安全需求。
实现
- 通过 Linux 内核安全模块(LSM)框架实现,使内核支持额外的安全策略。
- 使用安全策略和安全上下文标签,对进程和对象进行访问控制。
- 通过安全策略规则集,定义允许的操作、角色和类型。
常用的命令和示例
- Enforcing:在此模式下,SELinux 会执行所有安全策略并强制访问控制。如果发现违反了安全策略,SELinux 将阻止访问并在审计日志中记录相关信息。这是 SELinux 的默认模式,旨在提供最高级别的系统安全保护。
- Permissive:在此模式下,SELinux 不会阻止任何违反安全策略的操作,但仍会在审计日志中记录违规行为。这种模式通常用于调试和排错,因为它允许管理员了解哪些操作可能被阻止,同时不会对系统造成实际影响。
- Disabled:在此模式下,SELinux 完全禁用,不会执行任何安全策略。所有操作都将按照传统的 Linux 访问控制(如文件权限和所有者)进行,而不受 SELinux 的影响。这种模式可能会降低系统安全性,因此不推荐在生产环境中使用。
命令 | 描述 | 示例 |
---|---|---|
sestatus | 显示当前 SELinux 状态和概述 | sudo sestatus |
getenforce | 显示当前 SELinux 模式(enforcing, permissive, disabled) | sudo getenforce |
setenforce | 设置 SELinux 模式(0 = permissive, 1 = enforcing) | sudo setenforce 1 |
chcon | 更改文件或目录的 SELinux 上下文 | sudo chcon -t httpd_sys_content_t /var/www/html |
restorecon | 恢复文件或目录的默认 SELinux 上下文 | sudo restorecon -Rv /var/www/html |
semanage | 管理 SELinux 的配置、布尔值、上下文等 | sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?" |
ausearch | 搜索和分析 SELinux 的审计日志 | sudo ausearch -m AVC |
audit2allow | 从审计日志生成 SELinux 策略模块 | sudo audit2allow -a -M my_new_module |
semodule | 管理 SELinux 策略模块 | sudo semodule -i my_new_module.pp |
AppArmor
AppArmor(Application Armor)是一种 Linux 安全模块,旨在保护应用程序免受潜在威胁。它通过强制访问控制(MAC)限制应用程序对系统资源的访问,从而增强系统安全性。AppArmor 的策略配置相对简单,基于路径的访问控制易于理解和配置。
AppArmor 诞生于 1998 年,最初由 Immunix 公司开发,其目的是为 Linux 系统提供一个易于管理且高效的安全解决方案。2005 年,Novell 收购了 Immunix 公司,并在同年将 AppArmor 开源。自此,AppArmor 成为了一个独立的开源项目,吸引了许多开发者和维护者的加入。
2007 年,AppArmor 成为了 Ubuntu 7.10(Gutsy Gibbon)的默认安全模块。随后,其他 Linux 发行版,如 openSUSE 和 Debian,也开始支持 AppArmor。作为一种与 SELinux 并行的 Linux 安全模块,AppArmor 在易用性和性能方面具有明显优势,使其在个人电脑和服务器领域得到广泛应用。
AppArmor 的发展方向主要集中在以下几个方面:
- 简化策略配置和管理:AppArmor 将继续简化安全策略的配置和管理,使其更易于使用和部署。
- 提升性能:AppArmor 会继续优化其性能表现,以满足不断增长的系统安全需求,同时减少性能开销。
- 扩展功能和支持:AppArmor 将持续扩展其功能,以支持更多的 Linux 发行版和应用场景。此外,AppArmor 也可能引入新的安全机制,以增强其安全性能。
- 社区合作:AppArmor 将继续与开源社区合作,共同推动 Linux 安全模块的发展和完善。
优点
- 策略配置相对简单,基于路径的访问控制,易于理解和配置。
- 通过限制应用程序对文件系统和其他资源的访问,增强系统安全性。
- 应用于诸如 Ubuntu、openSUSE 和 Debian 等 Linux 发行版。
- 针对单个应用程序的策略配置,使得策略隔离更好。
- 较低的性能开销。
缺点
AppArmor 的缺点在于其安全策略相对简单,可能不适用于某些高度安全要求的场景,同时不支持基于角色的访问控制。因此,它更适用于一般安全要求的环境,如个人电脑和服务器等场景。在这些场合,AppArmor 能够提供简单且实用的安全策略,帮助用户保护系统资源和数据。
实现
- 通过 Linux 内核安全模块(LSM)框架实现,使内核支持额外的安全策略。
- 使用基于路径的访问控制策略,对应用程序进行访问控制。
- 通过简单的文本策略文件,定义允许的操作、文件访问权限等。
常用的命令和示例
命令 | 描述 | 示例 |
---|---|---|
apparmor_status | 显示当前 AppArmor 状态和概述 | sudo apparmor_status |
aa-enforce | 设置指定配置文件为强制模式(enforce) | sudo aa-enforce /etc/apparmor.d/usr.bin.firefox |
aa-complain | 设置指定配置文件为投诉模式(complain) | sudo aa-complain /etc/apparmor.d/usr.bin.firefox |
aa-disable | 禁用指定配置文件 | sudo aa-disable /etc/apparmor.d/usr.bin.firefox |
aa-genprof | 生成指定程序的 AppArmor 配置文件 | sudo aa-genprof /usr/bin/firefox |
aa-logprof | 分析日志,根据需求更新 AppArmor 配置文件 | sudo aa-logprof |
aa-autodep | 自动生成 AppArmor 配置文件的依赖项 | sudo aa-autodep /usr/bin/firefox |
aa-cleanprof | 清理无用的配置文件 | sudo aa-cleanprof |
aa-unconfined | 列出未受 AppArmor 限制的进程 | sudo aa-unconfined |
SELinux 与 AppArmor 对比
SELinux 和 AppArmor 都是 Linux 内核安全模块,分别用于实现访问控制安全策略。它们各自具有不同的优缺点,适用于不同的场景。
特性 / 安全模块 | SELinux | AppArmor |
---|---|---|
优点 | 详细的安全策略和访问控制;支持多种安全策略;广泛应用 | 策略配置简单;基于路径的访问控制;较低的性能开销 |
缺点 | 配置和学习复杂;性能开销较大 | 安全策略相对简单;不支持基于角色的访问控制 |
适用场景 | 高度安全要求的环境 | 一般安全要求的环境 |
发行版本 | RHEL、CentOS、Fedora 等 | Ubuntu、openSUSE、Debian 等 |